package la.iok.hzsvn.lewin.movie.cloud.service;

import la.iok.hzsvn.lewin.movie.cloud.entity.Room;
import la.iok.hzsvn.lewin.movie.cloud.model.RoomParam;
import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.core.model.RoomVo;
import la.iok.hzsvn.lewin.mybatis.model.PageVo;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.Date;
import java.util.List;

public interface RoomService extends BaseService<Room,Long> {
    /**
     * 保存房间
     * @param token 操作用户
     * @param room 房间信息
     * @return 新插入的房间id
     */
    @NotNull
    Long save(@NotNull Token token, @NotNull RoomParam room);

    /**
     * 更新房间名称
     * @param id 房间id
     * @param name 名称
     */
    void update(Long id,String name);

    /**
     * 验证权限并删除记录
     * @param id 房间id
     * @param token 操作用户
     */
    void delete(@Nullable Long id, @NotNull Token token);

    /**
     * 验证权限并更新记录，目前就更新名称
     * @param token 操作用户
     * @param id 房间id
     * @param param 房间参数
     */
    void update(@NotNull Token token, @Nullable Long id, @NotNull RoomParam param);

    /**
     * 分页查询房间
     * @param page 页号
     * @param limit 分页大小
     * @param token 操作用户,根据权限查询
     * @param orgUnitId 如果非空则只查询此店铺的房间
     * @param name 房间名称，模糊查询
     * @return 分页记录
     */
    PageVo<RoomVo> page(int page, int limit, @Nullable Token token, @Nullable Long orgUnitId, @Nullable String name);

    /**
     * 更新房间级别
     * @param id 房间id
     * @param version 查询记录时的版本。可能跟当前数据库版本不一致,那说明查询之后被修改了，此时当前调用就失败,需要刷新后重新提交
     * @param level 房间级别。0：经典房;1：VIP房
     * @param expireTime 等级过期时间
     */
    void updateLevel(@Nullable Long id, @Nullable Long version, int level, @Nullable Date expireTime);

    /**
     * 实体对象转换为视图对象
     * @param room 实体对象
     * @return 视图对象
     */
    @Nullable
    RoomVo po2vo(@Nullable Room room);

    @NotNull
    @NotNullElement
    List<RoomVo> rooms(@Nullable Long[] ids);

    /**
     * 查询多个店铺的所有房间
     * @param orgUnitIds 店铺列表
     * @return 房间列表
     */
    List<RoomVo> shopRooms(Long[] orgUnitIds);

}
